package com.cg.design.graphicdesignpattern.strategy;

/**
 * 表示猜拳游戏中的“手势”的类
 *
 * @program: LeetCode->Hand
 * @description: 表示猜拳游戏中的“手势”的类
 * @author: cg
 * @create: 2022-03-24 15:26
 **/
public class Hand {

    /**
     * 表示"石头"的值
     */
    public static final int HAND_VALUE_GUU = 0;
    /**
     * 表示"剪刀"的值
     */
    public static final int HAND_VALUE_CHO = 1;
    /**
     * 表示"布"的值
     */
    public static final int HAND_VALUE_PAA = 2;

    /**
     * 表示猜拳中的3种手势实例
     */
    public static final Hand[] HANDS = {
            new Hand(HAND_VALUE_GUU),
            new Hand(HAND_VALUE_CHO),
            new Hand(HAND_VALUE_PAA),
    };

    /**
     * 表示猜拳中手势所对应的字符串
     */
    private static final String[] NAME = {
            "石头", "剪刀", "布",
    };

    /**
     * 猜拳中出的手势的值
     */
    private final int handVale;

    private Hand(int handVale) {
        this.handVale = handVale;
    }

    /**
     * 根据手势的值获取其对应的实例
     *
     * @param handVale 手势的值
     * @return Hand实例
     */
    public static Hand getHand(int handVale) {
        return HANDS[handVale];
    }

    /**
     * 如果this赢了hand返回ture
     *
     * @param hand
     * @return
     */
    public boolean isStrongerThan(Hand hand) {
        return fight(hand) == 1;
    }

    /**
     * 如果this输给了hand返回false
     *
     * @param hand
     * @return
     */
    public boolean isWeakerThan(Hand hand) {
        return fight(hand) == -1;
    }

    /**
     * 计分：平0，胜1，负-1
     *
     * @param hand
     * @return
     */
    private int fight(Hand hand) {
        if (this == hand) {
            return 0;
        } else if ((this.handVale + 1) % 3 == hand.handVale) {
            return 1;
        } else {
            return -1;
        }
    }

    /**
     * 转换为手势值所对应的字符串
     *
     * @return
     */
    @Override
    public String toString() {
        return NAME[handVale];
    }

}
